#include "UsartInitHelper.h"
#include "BufDef.h"
#include "DeviceDef.h"
#include "GpioInitHelper.h"
#include "SimpleCompletion.h"
#include "LedBoardModule.h"

#include <string.h>

/** !\brief 中断函数表-开始
*
*/

/** !\brief 控制台串口中断回调函数
* 控制台串口数据处理
*/
//#ifdef DEBUG_TX_ENABLE
/* 控制台串口发送完成1字节中断。 */
void INT_SRC_USART3_TCI_IrqCallback(void) {
  // 停止发送
  USART_FuncCmd(CM_USART3, (USART_TX | USART_INT_TX_CPLT), DISABLE);
  // 清除发送完成中断标志
  USART_ClearStatus(CM_USART3, USART_FLAG_TX_CPLT);
}
/* 控制台串口发送完成1字节中断 */
//#endif // DEBUG_TX_ENABLE

//#ifdef DEBUG_TX_ENABLE
/**
 * @brief  控制台串口DMA接收完成中断
 * @param  None
 * @retval None
 */
void INT_SRC_DMA1_TC0_IrqCallback(void) {
  // 这里要重启一下中断。因为发送完成之后中断不生效就没法触发下一次发送
  // 刚初始化完成时会触发一次这个中断
  // 恢复发送中断。准备下次传输
  USART_FuncCmd(CM_USART3, USART_INT_TX_CPLT, ENABLE);

  // 清除DMA发送完成状态
  DMA_ClearTransCompleteStatus(CM_DMA1, DMA_FLAG_TC_CH0);
  //GPIO_ResetPins(U2_EN_PORT, U2_EN_PIN);
  // 信号量只有两个状态，是否为0.因为信号量数量类型为uint16_t
  rt_sem_release(debug_usart_sem);
  // 这里不用上面的单次释放是因为这里按理说资源只有一个，应该只释放一次，但是确保释放干净，需要清空列表。
  //completion_done(debug_usart_sem);
}
//#endif // DEBUG_TX_ENABLE
/* 控制台串口DMA接收完成中断 */

//#ifdef DEBUG_USART
/* 控制台串口错误处理中断 */
void USART3_RxError_IrqHandler(void) {
  //add your codes here
  rt_kprintf("debug console error!\n");
  (void) USART_ReadData(CM_USART3);

  USART_ClearStatus(CM_USART3, (USART_FLAG_PARITY_ERR | USART_FLAG_FRAME_ERR | USART_FLAG_OVERRUN));
  //DDL_DelayMS(1000UL);
  //__NVIC_SystemReset();
  //run_healthy = false;
}
//#endif // DEBUG_USART
/* 控制台串口错误处理中断 */

/* 控制台串口中断回调函数 */

// 中断函数表-结束

//Usart Config
void App_USARTxCfg(void) {
  // 共用的初始化结构体
  stc_usart_uart_init_t stcUartInit;

//#ifdef DEBUG_TX_ENABLE
  {// 初始化串口 控制台
    /* Enable peripheral clock */
    FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USART3, ENABLE);
    USART_DeInit(CM_USART3);
    (void)USART_UART_StructInit(&stcUartInit);
    stcUartInit.u32ClockSrc = USART_CLK_SRC_INTERNCLK;
    stcUartInit.u32ClockDiv = USART_CLK_DIV1;
    stcUartInit.u32CKOutput = USART_CK_OUTPUT_ENABLE;
    stcUartInit.u32Baudrate = 1843200UL;
    stcUartInit.u32DataWidth = USART_DATA_WIDTH_8BIT;
    stcUartInit.u32StopBit = USART_STOPBIT_1BIT;
    stcUartInit.u32Parity = USART_PARITY_NONE;
    stcUartInit.u32OverSampleBit = USART_OVER_SAMPLE_16BIT;
    stcUartInit.u32FirstBit = USART_FIRST_BIT_LSB;
    stcUartInit.u32StartBitPolarity = USART_START_BIT_FALLING;
    stcUartInit.u32HWFlowControl = USART_HW_FLOWCTRL_RTS;

    if (LL_OK != USART_UART_Init(CM_USART3, &stcUartInit, NULL)) {
      led_status.led_error = 1;
	  GPIO_SetPins(LED_RUN_PORT, LED_RUN_PIN);
      rt_kprintf("debug init faild!\n");
      for (;;) {
      }
    } else {
      USART_FilterCmd(CM_USART3, ENABLE);
      /* Enable TX && RX && RX interrupt function */
//#ifndef DEBUG_RX_ENABLE
      //USART_FuncCmd(CM_USART3, (USART_RX | USART_INT_RX), ENABLE);
	  USART_FuncCmd(CM_USART3, (USART_TX | USART_RX | USART_INT_TX_CPLT | USART_INT_RX), ENABLE);
//#else
//      USART_FuncCmd(DEBUG_USART, (USART_RX | USART_INT_RX | USART_RX_TIMEOUT | USART_INT_RX_TIMEOUT), ENABLE);
//#endif// DEBUG_RX_ENABLE
    }
  }   // 初始化串口 控制台
//#endif// DEBUG_TX_ENABLE
}
